/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MiniPaint4Infraestructura;

import MiniPaint4Logica.DatosDeFigura;
import java.awt.Point;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import MiniPaint4Logica.RepositorioPaint;

/**
 *
 * @author Micosil
 */
public class RepositorioEnBBDD implements RepositorioPaint {

    Connection connection = null;

    public RepositorioEnBBDD() {
        final String url = "jdbc:mysql://localhost:3306/test";
        final String usuario = "root";
        final String passwd = "root";
        try {
            connection = DriverManager.getConnection(url, usuario, passwd);
        } catch (SQLException ex) {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException ex1) {
                }
            }
        }
    }

    public void inicializar() {
        Statement instruccionCreacionTabla = null;
        try {
            instruccionCreacionTabla = connection.createStatement();
            instruccionCreacionTabla.execute("CREATE Table Dibujos ( "
                    + "NombreDibujo VarChar(50) NOT NULL, "
                    + "tipoFigura VarChar(50) NOT NULL, "
                    + "Puntos VarChar(50) NOT NULL)");
        } catch (SQLException ex) {
        } finally {
            if (instruccionCreacionTabla != null) {
                try {
                    instruccionCreacionTabla.close();
                } catch (SQLException ex) {
                }
            }

        }
    }

    public void close() {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException ex) {
            }
        }
    }

    public void guardarLista(String nombreDibujo, List<DatosDeFigura> listaDatos) {
        Statement borrador = null;
        try {
            borrador = connection.createStatement();
            borrador.executeUpdate("Delete from dibujos where nombreDibujo = '" + nombreDibujo + "'");
        } catch (SQLException ex) {
        } finally {
            if (borrador != null) {
                try {
                    borrador.close();
                } catch (SQLException ex) {
                }
            }
        }

        for (DatosDeFigura datos : listaDatos) {
            guardar(nombreDibujo, datos.tipoFigura, datos.listaPuntos);
        }
    }

    public String obtenerDibujos() {
        Statement obtenerDibujos = null;
        ResultSet listaDeResultados = null;
        String resultado = "";
        try {

            obtenerDibujos = connection.createStatement();
            listaDeResultados = obtenerDibujos.executeQuery("Select distinct nombreDibujo from dibujos;");
            while (listaDeResultados.next()) {
                resultado = resultado + listaDeResultados.getString("nombreDibujo") + "\n";
            }
            return resultado;


        } catch (SQLException ex) {
        } finally {
            try {
                if (obtenerDibujos != null) {
                    obtenerDibujos.close();
                }
                if (listaDeResultados != null) {
                    listaDeResultados.close();
                }
            } catch (SQLException ex) {
            }
            return resultado;
        }
    }

    public void guardar(String nombreDibujo, String tipoFigura, List<Point> listaDePuntos) {

        Statement insertarFigura = null;
        try {
            //El profesor de bases de datos me mataría si viera lo que voy a hacer - esto ni está normalizado ni nada, y seguramente tire la eficiencia por la ventana.
            //Además, el diseño permite (con un manejo de la base de datos mejor, separando los puntos en una tabla aparte y haciendo que la PK de la figura pase como FK a esos puntos) almacenar
            //figuras con cualquier número de puntos.

            String datosDePuntos = "";
            for (Point punto : listaDePuntos) {
                datosDePuntos = datosDePuntos + punto.x + "," + punto.y + ",";
            }
            datosDePuntos.substring(0, datosDePuntos.length());

            insertarFigura = connection.createStatement();

            insertarFigura.executeUpdate("INSERT INTO Dibujos (NombreDibujo, tipoFigura , Puntos) "
                    + "VALUES ('" + nombreDibujo + "','" + tipoFigura + "','" + datosDePuntos + "')");
        } catch (SQLException ex) {
        } finally {
            if (insertarFigura != null) {
                try {
                    insertarFigura.close();
                } catch (SQLException ex) {
                }
            }
        }

    }

    public List<DatosDeFigura> cargar(String nombreDibujo) {
        Statement query = null;
        ResultSet dibujo = null;
        List<DatosDeFigura> datos = new ArrayList();
        try {
            query = connection.createStatement();
            dibujo = query.executeQuery("SELECT * FROM Dibujos WHERE NombreDibujo = '" + nombreDibujo+"'");

            while (dibujo.next()) {
                final String tipoFigura = dibujo.getString("tipoFigura");
                final String datosDeFiguras = dibujo.getString("Puntos");
                StringTokenizer creadorDePuntos = new StringTokenizer(datosDeFiguras, ",");
                datos.add(generarDatosAPartirDeStrings(tipoFigura, creadorDePuntos)); //lógicamente, esto habría que hacerlo mejor para que sirviera para todo tipo de figuras. Seguramente indicándole a cada figura que se carge a sí misma.
                
            }

        } catch (SQLException ex) {
        } finally {
            try {
                if (dibujo != null) {
                    dibujo.close();
                }
                if (query != null) {
                    query.close();
                }
                return (datos);
            } catch (SQLException ex1) {
                return (datos);
            }

        }
    }

    private DatosDeFigura generarDatosAPartirDeStrings(final String tipoFigura, StringTokenizer creadorDePuntos) throws NumberFormatException {
        return new DatosDeFigura(tipoFigura, generarPuntoAPartirDeString(creadorDePuntos), generarPuntoAPartirDeString(creadorDePuntos));
    }

    private Point generarPuntoAPartirDeString(StringTokenizer creadorDePuntos) throws NumberFormatException {
        String primerTrozo = creadorDePuntos.nextToken();
        String segundoTrozo = creadorDePuntos.nextToken();
        Point paraDebug = new Point(Integer.parseInt(primerTrozo), Integer.parseInt(segundoTrozo));
        return paraDebug;
    }
}
